using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Net;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.OData;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
using server.status_db;
[Authorize]
public class AlfxsController : ODataController
{
    private status_oneContext _db;
    readonly ILogger<AlfxsController> _log;
    public AlfxsController(status_oneContext context, ILogger<AlfxsController> log)
    {
        
        _db = context;
        _log = log;
    }
    [HttpGet("/api/setAlfx")]
    public async Task<IActionResult> SetAlfx(string code, string year)
    {
        try
        {
            await _db.Database.ExecuteSqlCommandAsync($"Set_P_ALFX  {code},{year}");
            return NoContent();
        }
        catch (Exception e)
        {
            _log.LogError(e.ToString());
            return BadRequest(e.Message.ToString());
        }
    }
     [HttpGet("/api/setSaveAfter2019")]
    public async Task<IActionResult> SetSaveAfter2019(string code, string year)
    {
        try
        {
            await _db.Database.ExecuteSqlCommandAsync($"Set_P_SaveAfter2019 {code},{year},'all'");
            return NoContent();
        }
        catch (Exception e)
        {
            _log.LogError(e.ToString());
            return BadRequest(e.Message.ToString());
        }
    }
    private bool MCExists(int key)
    {
        return _db.Set_B_ALFX.Any(p => p.ID == key);
    }
    [HttpPut]
    public async Task<IActionResult> Put([FromODataUri] int key, [FromBody]Set_B_ALFX update)
    {

        try
        {
            if (!ModelState.IsValid)
            {

                var message = string.Join(" | ", ModelState.Values
                               .SelectMany(v => v.Errors)
                               .Select(e => e.Exception.Message));
                _log.LogError(this.User.Identity.Name + "," + message);
                return StatusCode(500, message);
            }
            if (key != update.ID)
            {
                return StatusCode(500, "key not eq id");
            }
            _db.Entry(update).State = EntityState.Modified;
            try
            {
                await _db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException e)
            {

                var message = "多用户不能同时修改同一条数据";
                _log.LogError(this.User.Identity.Name + "," + message);
                return StatusCode(500, message);

            }
            return Updated(update);
        }
        catch (Exception e)
        {
            _log.LogError(this.User.Identity.Name + "," + e.ToString());
            return StatusCode(500, e.Message.ToString());
        }
    }
    public async Task<IActionResult> Delete([FromODataUri] int key)
    {
        try
        {
            var mc = await _db.Set_B_ALFX.FindAsync(key);
            if (mc == null)
            {
                var message = "没有发现要删除的对象Id";
                 _log.LogError(this.User.Identity.Name + "," + message);
                return StatusCode(500,message);
            }
            _db.Set_B_ALFX.Remove(mc);
            await _db.SaveChangesAsync();
            return NoContent();
        }
        catch (Exception e)
        {
            _log.LogError(this.User.Identity.Name + "," + e.ToString());
            return StatusCode(500, e.Message.ToString());
        }
    }
    [HttpPost]
    public async Task<IActionResult> Post([FromBody] Set_B_ALFX model)
    {
        try
        {
            if (!ModelState.IsValid)
            {
                var message = string.Join(" | ", ModelState.Values
                                .SelectMany(v => v.Errors)
                                .Select(e => e.Exception.Message));
                return StatusCode(500, message);
            }
            _db.Set_B_ALFX.Add(model);
            await _db.SaveChangesAsync();

            return Created(model);
        }
        catch (Exception e)
        {
            _log.LogError(this.User.Identity.Name + "," + e.ToString());
            return StatusCode(500, e.Message.ToString());
        }
    }
    [EnableQuery]
    public IActionResult Get()
    {
        try
        {
            return Ok(_db.Set_B_ALFX);
        }
        catch (Exception e)
        {
            _log.LogError(this.User.Identity.Name + "," + e.ToString());
            return StatusCode(500, e.Message.ToString());
        }
    }
    
}   